// 战斗基础配置，定义全局战斗设置
export interface IBattleConfig {
    // 基础设置
    gameId: string;                  // 游戏ID
    battleMode: EBATTLE_MODE;        // 战斗模式
    mapId: number;                   // 地图ID
    timeScale: number;               // 时间缩放
    gravity: number;                 // 重力
    
    // 战斗流程
    waveCount: number;               // 波次总数
    waveInterval: number;            // 波次间隔(秒)
    preparationTime: number;         // 准备时间(秒)
    maxBattleTime: number;           // 最大战斗时间(秒)
    
    // 游戏机制
    autoPickupRange: number;         // 自动拾取范围
    defaultVigilantRadius: number;   // 默认警戒范围
    reviveCount: number;             // 复活次数
    reviveTime: number;              // 复活时间
    
    // 掉落设置
    dropRateMultiplier: number;      // 掉落率倍数
    expRateMultiplier: number;       // 经验倍数
    coinRateMultiplier: number;      // 金币倍数
    
    // 难度设置
    difficultyLevel: number;         // 难度等级
    enemyHpMultiplier: number;       // 敌人生命倍数
    enemyDamageMultiplier: number;   // 敌人伤害倍数
    
    // AI配置
    aiUpdateInterval: number;        // AI更新间隔
    aiAggroRange: number;            // AI仇恨范围
    aiMaxTargets: number;            // AI最大目标数
}

// 战斗模式枚举
export enum EBATTLE_MODE {
    NORMAL = 0,           // 普通战斗
    TOWER_DEFENSE = 1,    // 塔防模式
    BOSS_RUSH = 2,        // BOSS挑战
    ENDLESS = 3,          // 无尽模式
    ELITE = 4,            // 精英挑战
    ICE_OPERATION = 5,    // 冰域行动
}

// 默认战斗配置
export const DEFAULT_BATTLE_CONFIG: IBattleConfig = {
    gameId: "default",
    battleMode: EBATTLE_MODE.NORMAL,
    mapId: 1,
    timeScale: 1.0,
    gravity: 9.8,
    
    waveCount: 10,
    waveInterval: 5,
    preparationTime: 3,
    maxBattleTime: 600,
    
    autoPickupRange: 100,
    defaultVigilantRadius: 300,
    reviveCount: 1,
    reviveTime: 5,
    
    dropRateMultiplier: 1.0,
    expRateMultiplier: 1.0,
    coinRateMultiplier: 1.0,
    
    difficultyLevel: 1,
    enemyHpMultiplier: 1.0,
    enemyDamageMultiplier: 1.0,
    
    aiUpdateInterval: 0.5,
    aiAggroRange: 500,
    aiMaxTargets: 3
};

// 战斗配置管理器
export class BattleConfigManager {
    private static _instance: BattleConfigManager;
    
    private _currentConfig: IBattleConfig;
    private _customConfigs: Map<string, IBattleConfig> = new Map();
    
    private constructor() {
        this._currentConfig = { ...DEFAULT_BATTLE_CONFIG };
    }
    
    public static get instance(): BattleConfigManager {
        if (!this._instance) {
            this._instance = new BattleConfigManager();
        }
        return this._instance;
    }
    
    // 获取当前配置
    public getConfig(): IBattleConfig {
        return this._currentConfig;
    }
    
    // 加载战斗配置
    public loadConfig(config: Partial<IBattleConfig>): void {
        this._currentConfig = { ...DEFAULT_BATTLE_CONFIG, ...config };
    }
    
    // 根据模式获取配置
    public getConfigByMode(mode: EBATTLE_MODE): IBattleConfig {
        const config = { ...DEFAULT_BATTLE_CONFIG, battleMode: mode };
        
        // 根据不同模式调整配置
        switch (mode) {
            case EBATTLE_MODE.TOWER_DEFENSE:
                config.autoPickupRange = 150;
                config.waveInterval = 10;
                break;
                
            case EBATTLE_MODE.BOSS_RUSH:
                config.enemyHpMultiplier = 2.0;
                config.waveCount = 5;
                break;
                
            case EBATTLE_MODE.ENDLESS:
                config.waveCount = 100;
                config.maxBattleTime = 1800;
                break;
                
            case EBATTLE_MODE.ELITE:
                config.enemyHpMultiplier = 1.5;
                config.enemyDamageMultiplier = 1.3;
                break;
                
            case EBATTLE_MODE.ICE_OPERATION:
                config.gravity = 15;
                config.timeScale = 0.8;
                break;
        }
        
        return config;
    }
    
    // 保存自定义配置
    public saveCustomConfig(name: string, config: IBattleConfig): void {
        this._customConfigs.set(name, { ...config });
    }
    
    // 加载自定义配置
    public loadCustomConfig(name: string): boolean {
        const config = this._customConfigs.get(name);
        if (config) {
            this._currentConfig = { ...config };
            return true;
        }
        return false;
    }
} 